import { validationResult } from "express-validator";
import multer from "multer";
import { verifyJWT } from "./jwt.js";

/**
 * 参数验证中间件（高阶函数）
 *
 * @param  {...any} validators 验证器数组
 * @returns {Function} express 中间件
 */
export function validate(...validators) {
  // 返回验证中间件
  return async (req, res, next) => {
    // 执行所有验证器
    await Promise.all(validators.map((v) => v.run(req)));
    // 获取验证结果
    const errors = validationResult(req);
    // 如果验证通过
    if (errors.isEmpty()) {
      return next();
    }
    // 如果验证有错误
    return res.send({
      success: false,
      // 转换错误信息: [{path: 'name', msg: '用户名不能为空'}, {path: 'age', msg: '年龄不能为空'}] => {name: ['用户名不能为空'], age: ['年龄不能为空']}
      errors: errors.array().reduce((p, c) => {
        p[c.path] = (p[c.path] || []).concat(c.msg);
        return p;
      }, {}),
    });
  };
}

/**
 * 验证登录状态（express 自定义中间件）
 *
 * @param {Request} req 请求对象
 * @param {Response} res 响应对象
 * @param {Function} next express 中间件
 * @returns {any}
 */
export async function auth(req, res, next) {
  // 从请求头中获取 Authorization
  /** @type {{Authorization: string}} */
  const { authorization } = req.headers;
  const payload =
    authorization &&
    (await verifyJWT(
      authorization.startsWith("Bearer ")
        ? authorization.slice(7)
        : authorization
    ));
  // 获取用户 ID
  const userId = payload?.userId ?? req.session.userId;
  // 如果用户已登录
  if (userId) {
    return next();
  }
  // 用户未登录
  res.status(401).send({
    success: false,
    message: "用户尚未登录",
  });
}

// 使用内存保存文件内容
const storage = multer.memoryStorage();
// 限制上传文件不超过 800KB
export const upload = multer({
  storage,
  limits: {
    fileSize: 800 * 1024,
  },
});
